// src/utils/api.js

// 环境配置
const isDevelopment = import.meta.env.DEV;

// API基础URL配置已移至下方并导出

// 启用调试模式
export const DEBUG_MODE = isDevelopment;

// 导出API基础URL
export const API_BASE_URL = isDevelopment ? 
    '/api' : // 本地开发环境使用Vite代理
    'https://api.example.com'; // 生产环境

/**
 * 从localStorage获取认证token
 * @returns {string|null} 认证token或null
 */
export const getAuthToken = () => {
  return localStorage.getItem('authToken');
};

/**
 * 保存认证token到localStorage
 * @param {string} token 认证token
 */
export const saveAuthToken = (token) => {
  if (token) {
    localStorage.setItem('authToken', token);
    console.log('Token已存储:', token);
  }
};

/**
 * 清除localStorage中的认证token
 */
export const clearAuthToken = () => {
  localStorage.removeItem('authToken');
};

/**
 * 通用API请求函数
 * @param {string} endpoint API端点路径
 * @param {object} options 请求选项
 * @returns {Promise<any>} 响应数据
 */
export const apiRequest = async (endpoint, options = {}) => {
  // 构建完整URL，使用导出的API_BASE_URL常量
  const url = `${API_BASE_URL}${endpoint}`;
  
  // 设置默认选项
  const defaultOptions = {
    headers: {
      'Content-Type': 'application/json',
      'X-Requested-With': 'XMLHttpRequest'
    },
    credentials: 'include'
  };
  
  // 合并选项
  const mergedOptions = {
    ...defaultOptions,
    ...options,
    headers: {
      ...defaultOptions.headers,
      ...options.headers,
    },
  };
  
  // 添加认证token（如果存在）
  const token = getAuthToken();
  if (token) {
    mergedOptions.headers['Authorization'] = `Bearer ${token}`;
    
    // 同时添加到X-Authorization，部分后端可能使用此头部
    mergedOptions.headers['X-Authorization'] = `Bearer ${token}`;
  }
  
  // 调试模式下打印请求信息
  if (DEBUG_MODE) {
    console.log('API请求:', {
      url,
      options: mergedOptions,
    });
  }
  
  try {
    // 发送请求
    const response = await fetch(url, mergedOptions);
    
    // 调试模式下打印响应信息
    if (DEBUG_MODE) {
      console.log('API响应状态:', response.status);
      console.log('API响应头:', Object.fromEntries(response.headers.entries()));
    }
    
    // 检查响应状态
    if (!response.ok) {
      // 先获取响应体文本，避免重复读取流
      const responseText = await response.text();
      let errorDetails = responseText;
      try {
        // 尝试解析为JSON格式以获取更好的错误详情
        const errorData = JSON.parse(responseText);
        errorDetails = JSON.stringify(errorData);
      } catch (e) {
        // 如果不是JSON格式，保留原始文本
      }
      throw new Error(`HTTP error! status: ${response.status}\nDetails: ${errorDetails}`);
    }
    
    // 检查响应头中是否包含x-jwt-token
    const jwtToken = response.headers.get('x-jwt-token');
    if (jwtToken) {
      saveAuthToken(jwtToken);
      if (DEBUG_MODE) {
        console.log('从响应头获取并保存了JWT Token:', jwtToken);
      }
    }
    
    // 解析响应数据
    const data = await response.json();
    
    // 调试模式下打印响应数据
    if (DEBUG_MODE) {
      console.log('API响应数据:', data);
    }
    
    return data;
  } catch (error) {
    console.error('API请求失败:', error);
    throw error;
  }
};

/**
 * 封装GET请求
 * @param {string} endpoint API端点路径
 * @param {object} params 查询参数
 * @returns {Promise<any>} 响应数据
 */
export const get = async (endpoint, params = {}) => {
  // 构建查询字符串
  const queryParams = new URLSearchParams(params).toString();
  const url = queryParams ? `${endpoint}?${queryParams}` : endpoint;
  
  return apiRequest(url, {
    method: 'GET',
  });
};

/**
 * 封装POST请求
 * @param {string} endpoint API端点路径
 * @param {object} data 请求体数据
 * @returns {Promise<any>} 响应数据
 */
export const post = async (endpoint, data = {}) => {
  return apiRequest(endpoint, {
    method: 'POST',
    body: JSON.stringify(data),
  });
};

/**
 * 封装PUT请求
 * @param {string} endpoint API端点路径
 * @param {object} data 请求体数据
 * @returns {Promise<any>} 响应数据
 */
export const put = async (endpoint, data = {}) => {
  return apiRequest(endpoint, {
    method: 'PUT',
    body: JSON.stringify(data),
  });
};

/**
 * 封装删除操作，使用POST请求
 * @param {string} endpoint API端点路径
 * @param {object} options 请求选项，主要使用params传递ID
 * @returns {Promise<any>}
 */
export const del = async (endpoint, options = {}) => {
  // 构建查询字符串 - 确保所有参数值都作为字符串处理以避免精度问题
  let url = endpoint;
  if (options.params) {
    const params = {};
    
    // 将所有参数值转换为字符串，特别是ID这样的大整数
    for (const key in options.params) {
      if (Object.hasOwnProperty.call(options.params, key)) {
        params[key] = String(options.params[key]);
      }
    }
    
    const queryParams = new URLSearchParams(params).toString();
    url = queryParams ? `${endpoint}?${queryParams}` : endpoint;
  }
  
  // 构建请求选项 - 使用POST方法
  const requestOptions = {
    method: 'POST',
  };
  
  return apiRequest(url, requestOptions);
};

export default {
  get,
  post,
  put,
  delete: del,
  getAuthToken,
  saveAuthToken,
  clearAuthToken,
};